#pragma once

#include "noncopyable.h"

class InetAddress;
/*
 * 套接字类
 * 描述
 *      套接字类主要用于保存发起TCP连接之后系统文件描述符句柄,
 * 接口
 *      fd 获取套接字句柄
 *      bindAddress socket命名
 *      listen 监听套接字
 *      accept 接收连接请求
 *
 *      此外, 就是套接字属性控制
 *      端口复用 即快速结束TIME_WAIT状态
 *      心跳检测 检测连接是否断开
 *      地址复用
 *      ...
 *
 */
// 封装socket fd
class Socket : noncopyable
{
public:
    explicit Socket(int sockfd)
        : sockfd_(sockfd)
    {}

    ~Socket();

    int fd() const { return sockfd_; }
    void bindAddress(const InetAddress &localaddr);
    void listen();
    int accept(InetAddress *peeraddr);

    void shutdownWrite();

    void setTcpNoDelay(bool on);
    void setReuseAddr(bool on);
    void setReusePort(bool on);
    void setKeepAlive(bool on);
private:
    const int sockfd_;
};